home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Developer Toolbox 6.1
/
SGI Developer Toolbox 6.1 - Disc 4.iso
/
src
/
haeberli
/
styline
/
styline.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-01
|
12KB
|
531 lines
/*
* Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
* All Rights Reserved.
*
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
* the contents of this file may not be disclosed to third parties, copied or
* duplicated in any form, in whole or in part, without the prior written
* permission of Silicon Graphics, Inc.
*
* RESTRICTED RIGHTS LEGEND:
* Use, duplication or disclosure by the Government is subject to restrictions
* as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
* and Computer Software clause at DFARS 252.227-7013, and/or in similar or
* successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
* rights reserved under the Copyright Laws of the United States.
*/
/*
* styline -
* Spin a hidden line view of an sgo object
*
* Paul Haeberli - 1991
*/
#include "stdio.h"
#include "gl.h"
#include "device.h"
#include "sgiobj.h"
#include "vect.h"
#include "trilist.h"
#include "resource.h"
#include "showcaseui.h"
#include "hideline.h"
float frand();
int handleevents(long mx, long my, long dev, long val);
Button *quitbut;
Valuator *vwobblefreq, *vwobblemag;
Valuator *vwarpfreq, *vwarpmag;
Valuator *vextend, *vhalo, *vdropout;
Valuator *vcolordelta, *vsilwidth, *vwidth;
Button *mainbed;
long conx, cony, conhi;
long xorg, yorg;
float getvalval();
sgiobj *obj;
float tmat[4][4];
int dohide = 1;
#define DRAW_BACK 1
#define DRAW_SLIDERS 2
#define DRAW_OBJ 4
vect dropdir;
main(argc, argv)
int argc;
char **argv;
{
long dev, mx, my, xsize, ysize;
short val, smx, smy;
FILE *inf;
if(argc<2) {
inf = res_fopen("#t.mesh");
if(inf) {
res_fclose(inf);
obj = readsgiobj("#t.mesh");
} else {
fprintf(stderr,"usage: stlye obj.sgo\n");
exit(1);
}
} else {
obj = readsgiobj(argv[1]);
}
#ifdef DODROP
dropdir.x = 0.0;
dropdir.y = 1.0;
dropdir.z = 0.0;
hiddendirdrop(&dropdir,0.95);
#endif
initialize(argv[1]);
activate();
gettracktransform(tmat);
drawscene(DRAW_BACK|DRAW_SLIDERS|DRAW_OBJ);
while (1) {
switch (dev = qread(&val)) {
case F1KEY:
if(val) {
dohide = 1-dohide;
drawscene(DRAW_OBJ);
}
break;
case SKEY:
if(val) {
savewindow("save.rgb");
printf("image saved to save.rgb\n");
}
break;
case LEFTMOUSE:
qread(&smx); qread(&smy);
mx = smx - xorg;
my = smy - yorg;
if (val == UIBUTTONDOWN) {
sginap(8);
if (qtest() == dev) {
short tmp;
qread(&tmp); qread(&tmp); qread(&tmp);
val = UIBUTTONCLICK;
}
}
if (handleevents(mx, my, dev, val))
drawscene(DRAW_OBJ);
break;
case MIDDLEMOUSE:
if(val) {
trackclick();
while ((getbutton(MIDDLEMOUSE))) {
trackpoll();
gettracktransform(tmat);
drawscene(DRAW_OBJ);
}
}
break;
case MOUSEX:
mx = val - xorg;
break;
case MOUSEY:
my = val - yorg;
locatemouseevents(mx,my);
break;
case REDRAW:
getorigin(&xorg,&yorg);
drawscene(DRAW_BACK|DRAW_SLIDERS|DRAW_OBJ);
break;
}
}
}
initialize(iname)
char *iname;
{
long xsize, ysize;
long tmp, ymax;
xsize = 700;
ysize = 650;
conx = 30;
cony = 30;
conhi = 130;
ymax = 300;
quitbut = newpushbut(xsize-10-75,10);
vwobblefreq = newval(conx+0,cony,cony+conhi,0,15,0);
vwobblemag = newval(conx+40,cony,cony+conhi,0,15,0);
vwarpfreq = newval(conx+100,cony,cony+conhi,0,15,0);
vwarpmag = newval(conx+140,cony,cony+conhi,0,15,0);
vextend = newval(conx+200,cony,cony+conhi,0,15,0);
vhalo = newval(conx+250,cony,cony+conhi,0,15,0);
vdropout = newval(conx+300,cony,cony+conhi,0,15,0);
vcolordelta = newval(conx+350,cony,cony+conhi,0,15,0);
vsilwidth = newval(conx+410,cony,cony+conhi,0,15,0);
vwidth = newval(conx+450,cony,cony+conhi,0,15,0);
setvalval(vwobblefreq,0.6);
setvalval(vwobblemag,0.0);
setvalval(vwarpfreq,0.5);
setvalval(vwarpmag,0.0);
setvalval(vextend,0.0);
setvalval(vhalo,0.2);
setvalval(vdropout,0.0);
setvalval(vcolordelta,0.05);
setvalval(vsilwidth,0.0);
setvalval(vwidth,0.0);
mainbed = newbed(10,cony+conhi+30,xsize-10,ysize-10);
prefsize(xsize,ysize);
minsize(xsize,ysize);
maxsize(xsize,ysize);
winopen("Line Style Explorer");
getorigin(&xorg,&yorg);
doublebuffer();
RGBmode();
gconfig();
backbuffer(1);
frontbuffer(1);
cpack(0xe0e0e0);
clear();
}
activate()
{
initbut();
inittb();
qdevice(LEFTMOUSE);
qdevice(MIDDLEMOUSE);
qdevice(UPARROWKEY);
qdevice(MOUSEX);
qdevice(MOUSEY);
qdevice(SKEY);
qdevice(F1KEY);
tie(LEFTMOUSE, MOUSEX, MOUSEY);
loadbut(quitbut,"Quit");
enableval(vwobblefreq);
enableval(vwobblemag);
enableval(vwarpfreq);
enableval(vwarpmag);
enableval(vextend);
enableval(vhalo);
enableval(vdropout);
enableval(vcolordelta);
enableval(vsilwidth);
enableval(vwidth);
}
int followtrack(long mx,long my,Button *area)
{
trackclick();
while ((getbutton(LEFTMOUSE))) {
trackpoll();
gettracktransform(tmat);
drawscene(DRAW_OBJ);
}
return 0;
}
int followslider(long val, long my, Valuator *slider)
{
int oy;
oy = -1000;
if (val == UIBUTTONUP) return 0;
handleval(slider, LEFTMOUSE, val);
handleval(slider, MOUSEY, my+yorg);
while ((getbutton(LEFTMOUSE)) || (val == UIBUTTONCLICK)) {
my = getvaluator(MOUSEY);
if(my != oy) {
oy = my;
handleval(slider, MOUSEY, my);
drawval(slider);
val = UIBUTTONUP;
}
}
handleval(slider, LEFTMOUSE, val);
drawval(slider);
return 1;
}
int handleevents(long mx, long my, long dev, long val)
{
frontbuffer(1);
backbuffer(1);
if (selectedpressbut(quitbut,mx,my,val)) {
exit(0);
} else if (inval(vwobblefreq,mx,my)) {
return followslider(val,my,vwobblefreq);
} else if (inval(vwobblemag,mx,my)) {
return followslider(val,my,vwobblemag);
} else if (inval(vwarpfreq,mx,my)) {
return followslider(val,my,vwarpfreq);
} else if (inval(vwarpmag,mx,my)) {
return followslider(val,my,vwarpmag);
} else if (inval(vextend,mx,my)) {
return followslider(val,my,vextend);
} else if (inval(vhalo,mx,my)) {
return followslider(val,my,vhalo);
} else if (inval(vdropout,mx,my)) {
return followslider(val,my,vdropout);
} else if (inval(vcolordelta,mx,my)) {
return followslider(val,my,vcolordelta);
} else if (inval(vsilwidth,mx,my)) {
return followslider(val,my,vsilwidth);
} else if (inval(vwidth,mx,my)) {
return followslider(val,my,vwidth);
} else if (inbut(mainbed,mx,my)) {
return followtrack(mx,my,mainbed);
} else
return 0;
}
drawscene(how)
int how;
{
int labely;
long xsize, ysize;
float dx, dy, mag, freq, seglen, f;
backbuffer(1);
frontbuffer(1);
if(how & DRAW_BACK) {
cpack(0xd5d5d5);
clear();
labely = cony+conhi+10;
drawboldlabel("Wobble",conx+0+5,labely);
drawboldlabel("Freq",conx+0-5,12);
drawboldlabel("Mag",conx+40-3,12);
drawboldlabel("Warp",conx+100+10,labely);
drawboldlabel("Freq",conx+100-5,12);
drawboldlabel("Mag",conx+140-3,12);
drawboldlabel("Extend",conx+200-12,labely);
drawboldlabel("Halo",conx+250-5,labely);
drawboldlabel("Gaps",conx+300-8,labely);
drawboldlabel("Thresh",conx+350-12,labely);
drawboldlabel("Linewidths",conx+410-5,labely);
drawboldlabel("Edge",conx+410-5,12);
drawboldlabel("Inside",conx+450-3,12);
}
if(how & DRAW_SLIDERS) {
drawbut(quitbut);
drawval(vwobblefreq);
drawval(vwobblemag);
drawval(vwarpfreq);
drawval(vwarpmag);
drawval(vextend);
drawval(vhalo);
drawval(vdropout);
drawval(vcolordelta);
drawval(vsilwidth);
drawval(vwidth);
}
if(how & DRAW_OBJ) {
percentdone(50.0);
freq = 0.01+50.0*getvalval(vwobblefreq);
mag = 0.05*getvalval(vwobblemag);
seglen = 1.0/freq;
handsetwobble(freq,mag);
freq = 0.01+1.0*getvalval(vwarpfreq);
mag = 0.5*getvalval(vwarpmag);
if((1.0/freq)<seglen)
seglen = 1.0/freq;
handsetwarp(freq,mag);
handsetseglen(seglen/2.0);
f = 0.15*getvalval(vextend);
hiddenextend(f,f,0.5);
f = 0.15*getvalval(vhalo);
hiddenhalowidth(f);
f = getvalval(vdropout);
handsetdropout(f);
f = getvalval(vcolordelta);
hiddencolorthresh(f);
f = 0.025*getvalval(vsilwidth);
hiddensilwidth(f,f/2.0);
f = 0.025*getvalval(vwidth);
hiddenfacewidths(f,f,f);
drawborder(mainbed);
dx = mainbed->xmax-mainbed->xmin;
dy = mainbed->ymax-mainbed->ymin;
viewport(mainbed->xmin+2,mainbed->xmax-2,mainbed->ymin+2,mainbed->ymax-2);
backbuffer(1);
frontbuffer(0);
drawit(obj,dx/dy);
swapbuffers();
mmode(MSINGLE);
getsize(&xsize,&ysize);
viewport(0,xsize-1,0,ysize-1);
ortho2(-0.5,xsize-0.5,-0.5,ysize-0.5);
linewidth(1);
percentdone(100.0);
}
}
long lastmx, lastmy;
locatemouseevents(long mx, long my)
{
if ((mx == lastmx) && (my == lastmy))
return;
lastmx = mx;
lastmy = my;
locatebut(quitbut,mx,my);
locateval(vwobblefreq,mx,my);
locateval(vwobblemag,mx,my);
locateval(vwarpfreq,mx,my);
locateval(vwarpmag,mx,my);
locateval(vextend,mx,my);
locateval(vhalo,mx,my);
locateval(vdropout,mx,my);
locateval(vcolordelta,mx,my);
locateval(vsilwidth,mx,my);
locateval(vwidth,mx,my);
}
float myw;
/*
* GL output funcs
*
*/
int widthline(w)
float w;
{
myw = w;
}
int drawline(p0,p1)
vect *p0, *p1;
{
int iw;
iw = myw*400.0+frand();
if(iw<1)
iw = 1;
linewidth(iw);
bgnline();
v2f((float*)p0);
v2f((float*)p1);
endline();
}
drawit(obj,aspect)
sgiobj *obj;
float aspect;
{
matinit();
renderperspective(250,aspect,0.3,20.0);
translate(0.0,0.0,-3.0);
multmatrix(tmat);
cpack(0xa0b1bc);
clear();
if(dohide) {
beginhideline(drawline,widthline);
projectsgiobj(obj);
mmode(MSINGLE);
ortho2(-ASPECT,ASPECT,-1.0,1.0);
cpack(0x000000);
endhideline();
} else {
cpack(0x000000);
drawsgiobj(obj,DRAW_LINES);
}
}
#define TRITOL (0.0000000001)
static float *psprojmat;
static myttoc(t,c)
vect *t, *c;
{
float dx, dy, val, r;
dx = t->x-0.5;
dy = t->y-0.75;
r = sqrt(dx*dx+dy*dy);
val = 1.0-2*r;
if(val<0.0)
val = 0.0;
c->x = val;
c->y = val;
c->z = val;
}
static pstrifunc(p0,p1,p2)
long *p0, *p1, *p2;
{
vect tp0, tp1, tp2, n;
vect pj0, pj1, pj2, pn;
vect t, c0, c1, c2;
tile atile;
xformvert4(psprojmat,p0+OFFSET_POINT,&tp0);
xformvert4(psprojmat,p1+OFFSET_POINT,&tp1);
xformvert4(psprojmat,p2+OFFSET_POINT,&tp2);
if(trinormal(&tp0,&tp1,&tp2,&n,TRITOL)) {
pj0.x = tp0.x/tp0.w;
pj0.y = tp0.y/tp0.w;
pj0.z = tp0.z/tp0.w;
pj1.x = tp1.x/tp1.w;
pj1.y = tp1.y/tp1.w;
pj1.z = tp1.z/tp1.w;
pj2.x = tp2.x/tp2.w;
pj2.y = tp2.y/tp2.w;
pj2.z = tp2.z/tp2.w;
if(trinormal(&pj0,&pj1,&pj2,&pn,TRITOL) && pn.z>0.0) {
tenv(p0+OFFSET_NORMAL,p0+OFFSET_POINT,&t);
myttoc(&t,&c0);
tenv(p1+OFFSET_NORMAL,p1+OFFSET_POINT,&t);
myttoc(&t,&c1);
tenv(p2+OFFSET_NORMAL,p2+OFFSET_POINT,&t);
myttoc(&t,&c2);
c0.w = 1.0;
c1.w = 1.0;
c2.w = 1.0;
atile.pos[0].x = ASPECT*pj0.x;
atile.pos[0].y = pj0.y;
atile.pos[0].z = -pj0.z;
atile.pos[1].x = ASPECT*pj1.x;
atile.pos[1].y = pj1.y;
atile.pos[1].z = -pj1.z;
atile.pos[2].x = ASPECT*pj2.x;
atile.pos[2].y = pj2.y;
atile.pos[2].z = -pj2.z;
atile.col[0] = tocpack(&c0);
atile.col[1] = tocpack(&c1);
atile.col[2] = tocpack(&c2);
hiddentri(&atile);
}
}
}
projectsgiobj(obj)
sgiobj *obj;
{
float projmat[4][4];
float viewmat[4][4];
float psmat[4][4];
short magic;
mmode(MPROJECTION);
getmatrix(projmat);
mmode(MVIEWING);
getmatrix(viewmat);
matrixmult(projmat,viewmat,psmat);
psprojmat = &psmat[0][0];
tenvmat(viewmat);
applytotris(obj,pstrifunc);
}